﻿using System;
using System.IO;
using System.Data;
using System.Linq;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using System.Collections.Generic;
using Sinacor.UI.Bovespa.Alocacao;
using System.Windows.Threading;
using System.Text;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Sinacor.UI.Bovespa.Alocacao.Presenter;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using PSE.Framework.UI.Resources;

namespace Sinacor.UI.Bovespa.Alocacao.View.SmartClient
{

    public partial class MonitorAlocacao : SinacorWindow, IMonitorAlocacao, IDivergenciaCentralDepositaria, IAlocacaoBase, IDivergenciaAlocacao, IConsultaAlocadosPendentes
    {

        #region Atributos

        private Presenter.DivergenciaAlocacao _presenterDivergenciaAlocacao { get; set; }
        private bool habilitaSalvarAlteracoes;
        private bool habilitaConfirmarTodas;
        private bool alterando;
        private bool _marcadoCheck =true;

        public bool MarcadoCheck
        {
            get { return _marcadoCheck; }
            set { _marcadoCheck = value; }
        } 
       #endregion

        #region Propriedades

        public Presenter.ConsultaAlocadosPendentes PresenterConsultaAlocadosPendentes { get; set; }

        public Model.DivergenciaAlocacao CurrentModelDivergenciaAlocacao
        {
            get
            {
                Model.DivergenciaAlocacao divergenciaAlocacao;
                if (this.DtgDivergenciaAlocacao.IsEditing)
                {
                    divergenciaAlocacao = (Model.DivergenciaAlocacao)this.DtgDivergenciaAlocacao.EditItem;
                    return divergenciaAlocacao;
                }
                else
                    return (Model.DivergenciaAlocacao)this.DtgDivergenciaAlocacao.SelectedItem;
            }
        }

        #endregion

        #region Campos

        /// <summary>
        /// MonitorAlocacao - MonitorAlocacao
        /// </summary>
        public Presenter.MonitorAlocacao PresenterMonitorAlocacao { get; set; }

        public Presenter.DivergenciaCentralDepositaria PresenterDivergenciaCentralDepositaria { get; set; }
        
        private bool ReenviarAlocacao { get; set; }
        private bool RotularExpPesquisa { get; set; }
        private bool HabilitaEnvio { get; set; }
        private bool HabilitaReenvio { get; set; }
        private bool HabilitaInterromper { get; set; }
        private bool HabilitaTratar { get; set; }

        private string _style = string.Empty; 

        #endregion        

        #region Construtor

        public MonitorAlocacao()
        {
            InitializeComponent();

            #region [ABA 1] Monitor Alocacao

            PresenterMonitorAlocacao = new Presenter.MonitorAlocacao(this);
            this.TbiMonitorAlocacao.DataContext = this.PresenterMonitorAlocacao;

            this.DtgAlocacao.NewItemType = typeof(Model.MensagemAlocacao);
            this.DtgErrors.NewItemType = typeof(Model.MensagemAlocacao);
            this.DtgMensagens.NewItemType = typeof(Model.MensagemAlocacao);             

            #endregion

            #region [ABA 2] Alocação Direta Central Depositária

            this.PresenterConsultaAlocadosPendentes = new Presenter.ConsultaAlocadosPendentes(this);
            TbiConsultaNegociosAlocadosPendentesAlocacao.DataContext = this.PresenterConsultaAlocadosPendentes;
            this.dtgNegocios.NewItemType = typeof(Model.NegocioAlocado);
            this.dtgNegociosPendentes.NewItemType = typeof(Model.NegocioPendenteAlocacao);
            this.dtgMensagens.NewItemType = typeof(Model.MensagemSolicitacao);
            this.PresenterConsultaAlocadosPendentes.Inicializar();

            #endregion

            #region [ABA 3] Alocação Direta Central Depositária

            _presenterDivergenciaAlocacao = new Presenter.DivergenciaAlocacao(this);
            TbiAlocacaoDiretaCentralDepositaria.DataContext = this._presenterDivergenciaAlocacao;
            this.DtgDivergenciaAlocacao.NewItemType = typeof(Model.DivergenciaAlocacao);

            #endregion

            #region [ABA 4] Divergencia Central Depositária

            PresenterDivergenciaCentralDepositaria = new Presenter.DivergenciaCentralDepositaria(this);
            this.CentralDepositariaTabItem.DataContext = this.PresenterDivergenciaCentralDepositaria;

            this.grdDivergenciaCentralDepositaria.NewItemType = typeof(Model.DivergenciaCentralDepositaria);

            #endregion

            this.AfterInitialize += new RoutedEventHandler(MonitorAlocacao_AfterInitialize);

            RotularExpPesquisa = true;
        }
        
        #endregion

        #region After Initialize

        private void MonitorAlocacao_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();

            #region [ABA 1] Monitor Alocacao

            this.HabilitaEnvio = true;

            this.PresenterMonitorAlocacao.Inicializar();
            this.CmbMercado.UpdateTarget(SinacorComboBox.ItemsSourceProperty);

            this.RdbCompraVenda.IsChecked = true;
            this.RdbTodasMensagens.IsChecked = true;            
            
            #endregion

            #region [ABA 2] Alocação Direta Central Depositária

            this.SelecionarDataPregaoCalendario();

            #endregion

            #region [ABA 3] Alocação Direta Central Depositária

            this.habilitaSalvarAlteracoes = false;
            this.habilitaConfirmarTodas = false;
            this.alterando = false;

            #endregion

            #region [ABA 4] Divergencia Central Depositária

            this.PresenterDivergenciaCentralDepositaria.Inicializar();
            this.MercadoCombobox.ItemsSource = EnumWrapper<Model.Enum.TipoMercado>.GetEnums();
            this.MercadoCombobox.UpdateTarget(SinacorComboBox.ItemsSourceProperty);

            #endregion

            this.HideUserWaitingProcess();
        }

        #endregion

        #region IAlocacaoBase Members

        void IAlocacaoBase.AtualizarListaCalendarios()
        {
            this.cmbPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);

            cmbDataMovimento.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            cmbDataMovimento.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        #endregion

        #region [ABA 1] Monitor Alocacao

        #region Métodos       

        private void Pesquisar()
        {
            ClearServiceErrors();

            this.PresenterMonitorAlocacao.ConsultarMensagensAlocacao();
        }

        private void NovaPesquisa()
        {
            this.ClearServiceErrors();

            this.PresenterMonitorAlocacao.PararTemporizador();
            this.PresenterMonitorAlocacao.LimparFiltroPesquisa();
            this.PresenterMonitorAlocacao.ZerarContador();            

            this.RdbCompraVenda.IsChecked = true;
            this.RdbTodasMensagens.IsChecked = true;
            this.RdbNaoEnviaAlocacao.IsChecked = true;

            this.AtribuirDataMovimento();

            this.PresenterMonitorAlocacao.ListaMensagensAlocacaoRealizada.Clear();
            this.PresenterMonitorAlocacao.ListaErrosAlocacao.Clear();
            this.PresenterMonitorAlocacao.ListaMensagensAlocacao.Clear();

            this.AtualizarAlocacoesRealizadas();
            this.AtualizarErrosAlocacao();
            this.AtualizarMensagensAlocacao();
        }

        #endregion

        #region Eventos

        #region Eventos dos Botões

        private void BtnPesquisarAtivo_Click(object sender, RoutedEventArgs e)
        {
            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo
            {
                Codigo = this.TxtAtivo.Text,
                Mercado = null,
                DataPregao = ((Model.Calendario)this.cmbPregao.SelectedItem).DataPregao
            };

            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Alocacao.Label.MonitorAlocacao");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Ativo = pesquisaTitulo.TituloEscolhido.Codigo;
            }

            this.TxtAtivo.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void BtnPesquisarCliente_Click(object sender, RoutedEventArgs e)
        {
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente() { Apelido = TxtCliente.Text };
            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CasamentoManual, filtroPesq);
            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Alocacao.Label.PesquisaCliente");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.ApelidoCliente = pesquisaClientes.PesquisaClienteModel.Apelido;
                TxtCliente.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void BtnPesquisarMonitorAlocacao_Click(object sender, RoutedEventArgs e)
        {
            this.Pesquisar();
        }

        private void BtnNovaPesquisaMonitorAlocacao_Click(object sender, RoutedEventArgs e)
        {
            this.NovaPesquisa();
        }

        #endregion

        #region Eventos do Menu contextual

        private void menuEnviar_Click(object sender, RoutedEventArgs e)
        {
            this.ClearServiceErrors();

            this.PresenterMonitorAlocacao.IniciarEnvioMensagensAlocacao(!this.RdbNaoEnviaAlocacao.IsChecked.Value);
        }

        private void menuInterromper_Click(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.InterromperEnvioAlocacoes();
        }

        private void menuReenviar_Click(object sender, RoutedEventArgs e)
        {
            if (this.ConfirmarReenvioMensagens())
            {
                this.ClearServiceErrors();

                foreach (Model.MensagemAlocacao item in this.DtgMensagens.SelectedItems)
                {
                    this.PresenterMonitorAlocacao.ReenviarMensagemAlocacao(item, !this.RdbNaoEnviaAlocacao.IsChecked.Value);
                }                
            }
        }

        private void menuTratar_Click(object sender, RoutedEventArgs e)
        {
            this.ClearServiceErrors();

            ModelCollection<Model.MensagemAlocacao> mensagens = new ModelCollection<Model.MensagemAlocacao>();

            foreach (Model.MensagemAlocacao item in this.DtgMensagens.SelectedItems)
            {
                mensagens.Add(item);
            }

            if (mensagens.Count > 0)
            {
                this.PresenterMonitorAlocacao.TratarMensagensFalhas(mensagens);
            }            
        }

        private void menuEnviar_Loaded(object sender, RoutedEventArgs e)
        {
            ((SinacorContextMenuItem)sender).IsEnabled = this.HabilitaEnvio;            
        }

        private void menuInterromper_Loaded(object sender, RoutedEventArgs e)
        {
            ((SinacorContextMenuItem)sender).IsEnabled = this.HabilitaInterromper;            
        }

        private void menuReenviar_Loaded(object sender, RoutedEventArgs e)
        {
            if (this.DtgMensagens.SelectedItems.Count > 0)
            {
                ((SinacorContextMenuItem)sender).IsEnabled = this.HabilitaReenvio;   
            } 
            else
                ((SinacorContextMenuItem)sender).IsEnabled = false;   
        }

        private void menuTratar_Loaded(object sender, RoutedEventArgs e)
        {
            if (this.DtgMensagens.SelectedItems.Count > 0)
            {
                ((SinacorContextMenuItem)sender).IsEnabled = this.HabilitaTratar;
            }
            else
                ((SinacorContextMenuItem)sender).IsEnabled = false;
        }

        #endregion

        #region Eventos do Radio Button

        private void RdbCompraVenda_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.NaturezaOperacao = Model.Enum.NaturezaOperacao.CompraVenda;
        }

        private void RdbCompra_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
        }

        private void RdbVenda_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
        }

        private void RdbTodasMensagens_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = null;
            this.PresenterMonitorAlocacao.FiltrarMensagens(null);
        }

        private void RdbMensagensGeradas_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.Gerada;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.Gerada);
        }

        private void RdbMensagensFilaEnvio_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.FilaEnvio;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.FilaEnvio);
        }

        private void RdbMensagensInvalidadas_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.Invalidada;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.Invalidada);
        }

        private void RdbMensagensProcessandoRetorno_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.ProcessandoRetorno;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.ProcessandoRetorno);
        }

        private void RdbMensagensAceitas_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.Aceita;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.Aceita);
        }

        private void RdbMensagensFalhas_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.Falha;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.Falha);
        }

        private void RdbMensagensFalhasTratadas_Checked(object sender, RoutedEventArgs e)
        {
            this.PresenterMonitorAlocacao.FiltroMonitorAlocacao.Estado = Model.Enum.EstadoMensagemAlocacao.FalhaTratada;
            this.PresenterMonitorAlocacao.FiltrarMensagens(Model.Enum.EstadoMensagemAlocacao.FalhaTratada);
        }

        #endregion

        #region Eventos da Datagrid Mensagens

        private void DtgMensagens_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {
            if (((SinacorDataGrid)sender).SelectedItem != null && ((SinacorDataGrid)sender).SelectedItems.Count <= 1)
            {
                this.PresenterMonitorAlocacao.ConsultarAlocacoesRealizadas(((SinacorDataGrid)sender).SelectedItem as Model.MensagemAlocacao);
                this.PresenterMonitorAlocacao.ConsultarErrosAlocacao(((SinacorDataGrid)sender).SelectedItem as Model.MensagemAlocacao);
            }
            else
            {
                this.PresenterMonitorAlocacao.ListaMensagensAlocacaoRealizada.Clear();
                this.PresenterMonitorAlocacao.ListaErrosAlocacao.Clear();

                this.DtgAlocacao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.DtgErrors.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }
        }

        private void DtgMensagens_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            // Verifica se quem disparou o evento foi uma linha
            if (e.OriginalSource is BaseRow)
            {
                if (e.ItemInfo.Item != null)
                {
                    // Limpando style
                    this._style = string.Empty;

                    this.PresenterMonitorAlocacao.VerificarEstadoMensagem(e.ItemInfo.Item as Model.MensagemAlocacao);

                    // Retornando style
                    e.Style = _style;
                }
            }
        }

        #endregion

        #endregion

        #region IMonitorAlocacao Members

        /// <summary>
        /// Indica a cor de mensagem aceita
        /// </summary>
        public void ApresentarMensagemAceita()
        {
            this._style = BaseRow.GridRowBusiness02;
        }

        /// <summary>
        /// Indica a cor de mensagem falha
        /// </summary>
        public void ApresentarMensagemFalha()
        {
            this._style = BaseRow.GridRowBusiness06;
        }

        /// <summary>
        /// Indica a cor de mensagem falha tratada
        /// </summary>
        public void ApresentarMensagemFalhaTratada()
        {
            this._style = BaseRow.GridRowBusiness10;
        }

        /// <summary>
        /// Indica a cor de mensagem na fila de envio
        /// </summary>
        public void ApresentarMensagemFilaEnvio()
        {
            this._style = BaseRow.GridRowBusiness03;
        }

        /// <summary>
        /// Indica a cor de mensagem gerada
        /// </summary>
        public void ApresentarMensagemGerada()
        {
            this._style = BaseRow.GridRowBusiness01;
        }

        /// <summary>
        /// Indica a cor de mensagem invalidada
        /// </summary>
        public void ApresentarMensagemInvalidada()
        {
            this._style = BaseRow.GridRowBusiness09;
        }

        /// <summary>
        /// Indica a cor de mensagem processando retorno
        /// </summary>
        public void ApresentarMensagemProcessandoRetorno()
        {
            this._style = BaseRow.GridRowBusiness05;
        }

        /// <summary>
        /// Selecionar no combobox de pregão a data do movimento
        /// </summary>
        public void AtribuirDataMovimento()
        {
            this.cmbPregao.SelectedValue = this.PresenterMonitorAlocacao.InformacoesMovimento.DataMovimento;
        }

        /// <summary>
        /// Atualiza pesquisa
        /// </summary>
        public void AtualizarPesquisa()
        {
            this.cmbPregao.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.CmbMercado.UpdateTarget(SinacorComboBox.SelectedValueProperty);

            this.TxtAtivo.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtTimer.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtCliente.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtNumNegocio.UpdateTarget(SinacorTextBox.TextProperty);
        }

        /// <summary>
        /// Atualiza data grid de alocações
        /// </summary>
        public void AtualizarAlocacoesRealizadas()
        {
            this.Dispatcher.BeginInvoke(new Action(delegate()
            {
                this.DtgAlocacao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }), null);
        }

        /// <summary>
        /// Atualiza data grid de erros de alocação
        /// </summary>
        public void AtualizarErrosAlocacao()
        {
            this.Dispatcher.BeginInvoke(new Action(delegate()
            {
                this.DtgErrors.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }), null);
        }

        /// <summary>
        /// Atualiza data grid de mensagens de alocação
        /// </summary>
        public void AtualizarMensagensAlocacao()
        {
            this.Dispatcher.BeginInvoke(new Action(delegate()
            {
                this.DtgMensagens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }), null);
        }

        /// <summary>
        /// Atualiza os textbox´s com os totalizadores
        /// </summary>
        public void AtualizarTotalizadores()
        {
            this.Dispatcher.BeginInvoke(new Action(delegate()
            {
                this.TxtTodasMensagens.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensGeradas.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensFilaEnvio.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensInvalidadas.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensProcessandoRetorno.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensAceitas.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensFalhas.UpdateTarget(SinacorInt32TextBox.ValueProperty);
                this.TxtMensagensFalhasTratadas.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            }), null);
        }

        /// <summary>
        /// Solicita confirmação ao usuário para iniciar o processo de geração e envio de mensagens de  alocação
        /// </summary>
        public bool ConfirmarEnvioAlocacoes()
        {
            bool isConfirmaEnvio = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.ConfirmarExecucaoProcesso").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);
            
            if (result == SinacorMessageBoxResult.Yes)
            {
                isConfirmaEnvio = true;
            }

            return isConfirmaEnvio;
        }

        /// <summary>
        /// Solicita confirmação ao usuário para interromper o processo de geração de alocações
        /// </summary>
        public bool ConfirmarInterrupcaoGeracaoAlocacoes()
        {
            bool isConfirmaInterrupcao = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.InterromperExecucaoProcesso").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isConfirmaInterrupcao = true;
            }

            return isConfirmaInterrupcao;
        }

        /// <summary>
        /// Solicita confirmação ao usuário para interromper o processo de geração de alocações
        /// </summary>
        public bool ConfirmarReenvioMensagens()
        {
            bool isConfirmaReenvio = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.ReenvioMsgAlocacao").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isConfirmaReenvio = true;
            }

            return isConfirmaReenvio;            
        }

        /// <summary>
        /// Solicita confirmação ao usuário para realizar o tratamento de falhas da mensagens selecionadas
        /// </summary>
        public bool ConfirmarTratamentoFalhas()
        {
            bool isConfirmaTratamento = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.TratarFalhas").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isConfirmaTratamento = true;
            }

            return isConfirmaTratamento;
        }

        /// <summary>
        /// Mostra mensagem de Usuário sem permissão.
        /// </summary>
        public void InformarUsuarioSemPermissao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.ExceptionMessage.UsuarioSemPermissao").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Mostra mensagem de Movimento de ordem não aberto
        /// </summary>
        public void InformarMovimentoOrdemNaoAberto()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.ExceptionMessage.MovOrdensNaoFechado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Desabilita todos os itens do menu contextual da grid de mensagens
        /// </summary>
        public void DesabilitarMenuMensagensAlocacao()
        {
            this.HabilitaEnvio = false;
            this.HabilitaReenvio = false;
            this.HabilitaInterromper = false;
            this.HabilitaTratar = false;            
        }

        /// <summary>
        /// Habilita ou desabilita o item de menu "Reenviar Mensagem" conforme parâmetro de entrada
        /// </summary>
        /// <param name="habilita"></param>
        public void HabilitarMenuReenviarMensagem(bool habilita)
        {
            this.HabilitaReenvio = habilita;
        }

        /// <summary>
        /// Habilita ou desabilita o item de menu "Tratar Falha" conforme parâmetro de entrada
        /// </summary>
        /// <param name="habilita"></param>
        public void HabilitarMenuTratarFalha(bool habilita)
        {
            this.HabilitaTratar = habilita;
        }

        /// <summary>
        /// Possibilita a visualização ou não do item de menu "Enviar mensagens de
        /// alocações D0 e D-1", conforme parâmetro de entrada
        /// </summary>
        /// <param name="visualizar"></param>
        public void VisualizarMenuEnviarMensagensAlocacao(bool visualizar)
        {
            this.HabilitaEnvio = visualizar;
        }

        /// <summary>
        /// Possibilita a visualização ou não do item de menu "Interromper envio de
        /// mensagens de alocações", conforme parâmetro de entrada
        /// </summary>
        /// <param name="visualizar"></param>
        public void VisualizarMenuInterromperEnvioMensagens(bool visualizar)
        {
            this.HabilitaInterromper = visualizar;
        }

        #endregion

        #endregion

        #region [ABA 2] Alocação Direta Central Depositária

        #region IConsultaAlocadosPendentes Members

        public void AlterarTituloNegociosAlocados()
        {
            this.ExpConsultaNegociosAlocadosCentralDepositaria.Header = this.FindResource("Bovespa.Alocacao.Label.ConsultaNegociosAlocadosCentralDepositaria");
        }

        public void AlterarTituloNegociosPendentesAlocacao()
        {
            this.ExpConsultaNegociosAlocadosCentralDepositaria.Header = this.FindResource("Bovespa.Alocacao.Label.ConsultaNegociosPendentesAlocacaoCentralDepositaria");
        }

        public void AtualizarListaMensagens()
        {
            this.Dispatcher.BeginInvoke(new  Action ( delegate()
            {
                string data = this.PresenterConsultaAlocadosPendentes.UltimaSolicitacao.Data.Value.Date.ToShortDateString();
                string hora = this.PresenterConsultaAlocadosPendentes.UltimaSolicitacao.Data.Value.ToShortTimeString();
                if (string.IsNullOrEmpty(data))
                {
                    ExpPesquisa.Header = this.TryFindResource("Bovespa.Alocacao.Label.Pesquisa").ToString();
                }
                else
                {
                    ExpPesquisa.Header = string.Format(this.TryFindResource("Bovespa.Alocacao.Label.UltimaSolicitacaoCBLC").ToString(),
                    this.PresenterConsultaAlocadosPendentes.UltimaSolicitacao.Data.Value.Date.ToShortDateString(),
                    this.PresenterConsultaAlocadosPendentes.UltimaSolicitacao.Data.Value.ToShortTimeString());
                }

                this.dtgMensagens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.lstErros.UpdateTarget(SinacorListBox.ItemsSourceProperty);
            })
            , null); 
        }
        public void atualizaBackGround()
        {


        }
        public void AtualizarListaNegociosAlocados()
        {
            this.dtgNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarListaNegociosPendentesAlocacao()
        {
            this.dtgNegociosPendentes.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void SelecionarDataPregaoCalendario()
        {
            this.cmbPregaoNegocios.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            this.cmbPregaoNegocios.SelectedIndex = 0;
        }

        public void TornarVisivelNegociosAlocados()
        {
            this.dtgNegocios.Visibility = Visibility.Visible;
            this.dtgNegociosPendentes.Visibility = Visibility.Hidden;
        }

        public void TornarVisivelNegociosPendentesAlocacao()
        {
            this.dtgNegociosPendentes.Visibility = Visibility.Visible;
            this.dtgNegocios.Visibility = Visibility.Hidden;
        }
        public delegate bool statusAtualizacaoAutomatica();

        public bool VerificarAtualizacaoAutomatica()
        {
            return MarcadoCheck;
            
        }


        #endregion

        #region Pesquisar e Nova Pesquisa ConsultaNegociosAlocados

        private void btnNovaPesquisaNegociosAlocados_Click(object sender, RoutedEventArgs e)
        {
            this.LimparCampos();
            chkAtualizacao.IsChecked = true;
            this.SelecionarDataPregaoCalendario();
        }

        private void LimparCampos()
        {
            this.ClearServiceErrors();            

            this.PresenterConsultaAlocadosPendentes.ListaNegociosAlocados.Clear();
            this.PresenterConsultaAlocadosPendentes.ListaNegociosPendentesAlocacao.Clear();
            this.PresenterConsultaAlocadosPendentes.UltimaSolicitacao = new Sinacor.UI.Bovespa.Alocacao.Model.Solicitacao();

            this.dtgMensagens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

            this.rdbNegociosAlocados.IsChecked = true;
            this.rdbNegociosPendentesAlocacao.IsChecked = false;

            ExpPesquisa.Header = this.TryFindResource("Bovespa.Alocacao.Label.Pesquisa").ToString();
        }

        private void btnPesquisarNegociosAlocados_Click(object sender, RoutedEventArgs e)
        {
            this.PesquisarNegociosAlocados();
        }

        private void PesquisarNegociosAlocados()
        {
            this.ClearServiceErrors(); 

            this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));

            this.VerificaTipoSolicitacao();
            
            this.PresenterConsultaAlocadosPendentes.ConsultarNegocios();
        }

        #endregion

        #region Outros Métodos

        private void VerificaTipoSolicitacao()
        {
            if (rdbNegociosAlocados.IsChecked.Value)
                PresenterConsultaAlocadosPendentes.FiltroSolicitacao.Tipo = Sinacor.UI.Bovespa.Alocacao.Model.Enum.TipoSolicitacao.NegociosAlocados;
            else
                PresenterConsultaAlocadosPendentes.FiltroSolicitacao.Tipo = Sinacor.UI.Bovespa.Alocacao.Model.Enum.TipoSolicitacao.NegociosPendentesAlocacao;

            PresenterConsultaAlocadosPendentes.AtualizarTipoConsulta();
        }

        private void SinacorTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.OriginalSource is SinacorTabControl)
            {
                if (TbiConsultaNegociosAlocadosPendentesAlocacao.IsLoaded)
                {
                    this.VerificaTipoSolicitacao();
                    PresenterConsultaAlocadosPendentes.Inicializar();
                }
            }
        }

        private void dtgMensagens_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {
            this.ClearServiceErrors();
            lstErros.Items.Clear();

            base.ShowUserWaitingProcess();

            if (dtgMensagens.HasItems)
            {
                Model.MensagemSolicitacao mensagemSolicitacao = (Model.MensagemSolicitacao)dtgMensagens.SelectedItem;
                if (mensagemSolicitacao != null && mensagemSolicitacao.Erros.Count > 0)
                {
                    foreach (Model.MensagemErro item in mensagemSolicitacao.Erros)
                    {
                        lstErros.Items.Add(item.Descricao);
                    }
                }
            }

            base.HideUserWaitingProcess();
        }

        private void dtgMensagens_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                // Limpando style
                _style = string.Empty;

                // Verifica se quem disparou o evento foi uma linha
                if (e.OriginalSource is BaseRow)
                {
                    //Verifica estado ordem
                    Model.MensagemSolicitacao mensagemSolicitacao = (e.ItemInfo.Item as Model.MensagemSolicitacao);
                    if (mensagemSolicitacao.Status == Model.Enum.StatusSolicitacao.GeradaNaoEnviada)
                        _style = BaseRow.GridRowBusiness02;
                    else if (mensagemSolicitacao.Status == Model.Enum.StatusSolicitacao.NaFilaAguardandoEnvio)
                        _style = BaseRow.GridRowBusiness03;
                    else if (mensagemSolicitacao.Status == Model.Enum.StatusSolicitacao.RequisicaoEnviada)
                        _style = BaseRow.GridRowBusiness01;
                    else if (mensagemSolicitacao.Status == Model.Enum.StatusSolicitacao.AguardandoArquivo)
                        _style = BaseRow.GridRowBusiness13;
                    else if (mensagemSolicitacao.Status == Model.Enum.StatusSolicitacao.ArquivoImportado)
                        _style = BaseRow.GridRowBusiness04;
                    else if (mensagemSolicitacao.Status == Model.Enum.StatusSolicitacao.Erro)
                        _style = BaseRow.GridRowBusiness06;
                }

                // Retornando style
                e.Style = _style;
            }
        }

        private void menuEnviarSolicitacao_Click(object sender, RoutedEventArgs e)
        {
            this.VerificaTipoSolicitacao();
            PresenterConsultaAlocadosPendentes.SolicitarAlocacao();
        }

        private void menuEnviarSolicitacaoPendentes_Click(object sender, RoutedEventArgs e)
        {
            this.VerificaTipoSolicitacao();
            PresenterConsultaAlocadosPendentes.SolicitarAlocacao();
        }
        #endregion

        #endregion

        #region [ABA 3] Alocação Direta Central Depositária

        #region Seleção de Abas

        private void tbControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is SinacorTabControl)
            {
                if (((SinacorTabControl)sender).SelectedIndex == 2)
                {
                    this.DataContext = this._presenterDivergenciaAlocacao;
                }
            }
        }

        #endregion Seleção de Abas
        
        #region Pesquisar e Nova Pesquisa

        private void btnPesquisarAlocacaoDireta_Click(object sender, RoutedEventArgs e)
        {
            this.Carrega_Grid();
        }

        private void btnNovaPesquisaAlocacaoDireta_Click(object sender, RoutedEventArgs e)
        {
            this.ClearServiceErrors();
            this.chkSemCiencia.IsChecked = true;
            this._presenterDivergenciaAlocacao.FiltroDivergenciaAlocacao = new Model.Parameter.FiltroDivergenciaAlocacao();
            this._presenterDivergenciaAlocacao.ListaDivergenciasAlocacao = new ModelCollection<Model.DivergenciaAlocacao>();
            this.habilitaConfirmarTodas = false;
            this.habilitaSalvarAlteracoes = false;
            this.AtualizarListaDivergenciasAlocacao();
        }

        #endregion Pesquisar e Nova Pesquisa

        #region Outros Métodos

        private void ConfirmarCiencia()
        {
            ShowUserWaitingProcess();

            this._presenterDivergenciaAlocacao.AtualizarDadosCienciaTodasDivergencias();

            this.habilitaConfirmarTodas = false;
            this.habilitaSalvarAlteracoes = true;

            HideUserWaitingProcess();
        }

        private void SalvarAlteracoes()
        {
            this.ClearServiceErrors();
            this.ShowUserWaitingProcess();

            try
            {
                this._presenterDivergenciaAlocacao.AtualizarCienciaDivergenciasAlocacao();
                this.habilitaSalvarAlteracoes = false;
            }
            catch (Exception ex)
            {
                base.ShowError(ex);
            }

            this.HideUserWaitingProcess();
        }

        private void Carrega_Grid()
        {
            this.ClearServiceErrors();
            this.ShowUserWaitingProcess();

            if (this.chkSemCiencia.IsChecked == true)
                this._presenterDivergenciaAlocacao.FiltroDivergenciaAlocacao.IndicadorCiencia = false;
            else
                this._presenterDivergenciaAlocacao.FiltroDivergenciaAlocacao.IndicadorCiencia = true;

            this._presenterDivergenciaAlocacao.ConsultarDivergenciasAlocacao();

            this.HideUserWaitingProcess();
        }

        private void ctxMnuConfirmarTodas_Click(object sender, RoutedEventArgs e)
        {
            this.ConfirmarCiencia();
        }

        private void ctxMnuSalvarAlteracoes_Click(object sender, RoutedEventArgs e)
        {
            this.SalvarAlteracoes();
        }

        private void ctxMnuConfirmarTodas_Loaded(object sender, RoutedEventArgs e)
        {
            if (this._presenterDivergenciaAlocacao.ListaDivergenciasAlocacao.Count > 0)
            {
                foreach (Model.DivergenciaAlocacao item in this._presenterDivergenciaAlocacao.ListaDivergenciasAlocacao)
                {
                    if (item.IndicadorCiencia == false)
                        habilitaConfirmarTodas = true;
                }
            }

            if (alterando)
                habilitaConfirmarTodas = false;

            ((SinacorContextMenuItem)sender).IsEnabled = habilitaConfirmarTodas;
        }

        private void ctxMnuSalvarAlteracoes_Loaded(object sender, RoutedEventArgs e)
        {
            if (this._presenterDivergenciaAlocacao.ListaDivergenciasAlocacao.HasChanges)
                this.habilitaSalvarAlteracoes = true;

            ((SinacorContextMenuItem)sender).IsEnabled = habilitaSalvarAlteracoes;
        }

        private void chkIndicadorCiencia_Checked(object sender, RoutedEventArgs e)
        {
            Model.DivergenciaAlocacao item = _presenterDivergenciaAlocacao.ListaDivergenciasAlocacao[DtgDivergenciaAlocacao.SelectedIndex];

            SinacorCheckBox _chkIndicadorCiencia = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "chkIndicadorCiencia") as SinacorCheckBox;
            if (_chkIndicadorCiencia.IsChecked == true)
                item.IndicadorCiencia = true;

            this._presenterDivergenciaAlocacao.AtualizarDadosCienciaDivergencia(item);

            SinacorTextBox _txtDataHoraCiencia = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "txtDataHoraCiencia") as SinacorTextBox;
            SinacorInt32TextBox _txtCodigoUsuario = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "txtCodigoUsuario") as SinacorInt32TextBox;
            SinacorTextBox _txtEstacao = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "txtEstacao") as SinacorTextBox;

            _txtDataHoraCiencia.Text = string.Format("{0:G}", item.DataHoraCiencia);
            _txtCodigoUsuario.Value = item.CodigoUsuario;
            _txtEstacao.Text = item.Estacao;

            this.AtualizarListaDivergenciasAlocacao();
        }

        private void chkIndicadorCiencia_Unchecked(object sender, RoutedEventArgs e)
        {
            SinacorTextBox _txtDataHoraCiencia = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "txtDataHoraCiencia") as SinacorTextBox;
            SinacorInt32TextBox _txtCodigoUsuario = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "txtCodigoUsuario") as SinacorInt32TextBox;
            SinacorTextBox _txtEstacao = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "txtEstacao") as SinacorTextBox;

            _txtDataHoraCiencia.Clear();
            _txtCodigoUsuario.Clear();
            _txtEstacao.Clear();
        }

        private void DtgDivergenciaAlocacao_ContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            DtgDivergenciaAlocacao.AllowBeginUpdate = !(this.CurrentModelDivergenciaAlocacao != null &&
                                                        this.CurrentModelDivergenciaAlocacao.IndicadorCiencia.Value);
        }

        private void DtgDivergenciaAlocacao_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {
            DtgDivergenciaAlocacao.AllowBeginUpdate = !(this.CurrentModelDivergenciaAlocacao != null &&
                                                        this.CurrentModelDivergenciaAlocacao.IndicadorCiencia.Value);
        }

        private void DtgDivergenciaAlocacao_BeingUpdated(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (this.CurrentModelDivergenciaAlocacao != null &&
                this.CurrentModelDivergenciaAlocacao.IndicadorCiencia.Value)
                {
                    e.Cancel = true;
                }
                else
                {
                    alterando = true;
                }
            }
        }

        private void DtgDivergenciaAlocacao_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                Model.DivergenciaAlocacao divergenciaAlocacao = (Model.DivergenciaAlocacao)e.ItemInfo.Item;

                SinacorCheckBox _chkIndicadorCiencia = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "chkIndicadorCiencia") as SinacorCheckBox;
                if (_chkIndicadorCiencia.IsChecked == true)
                    CurrentModelDivergenciaAlocacao.IndicadorCiencia = true;

                alterando = false;
            }
        }

        private void DtgDivergenciaAlocacao_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {

                if (_presenterDivergenciaAlocacao.ListaDivergenciasAlocacao.Count > DtgDivergenciaAlocacao.SelectedIndex)
                {
                    Model.DivergenciaAlocacao item = _presenterDivergenciaAlocacao.ListaDivergenciasAlocacao[DtgDivergenciaAlocacao.SelectedIndex];

                    SinacorCheckBox _chkIndicadorCiencia = ControlHelper.FindChild(DtgDivergenciaAlocacao.GetEditRow(), "chkIndicadorCiencia") as SinacorCheckBox;
                    if (_chkIndicadorCiencia.IsChecked == true)
                        item.IndicadorCiencia = false;

                    item.DataHoraCiencia = null;
                    item.CodigoUsuario = null;
                    item.Estacao = string.Empty;
                }

                alterando = false;

                this.ClearServiceErrors();
            }
        }

        private void DtgDivergenciaAlocacao_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.F3:
                    if (e.IsDown)
                    {
                        if (this.DtgDivergenciaAlocacao.EditIndex != -1)
                        {
                            this.DtgDivergenciaAlocacao.EndUpdate();
                        }
                    }
                    break;
            }
        }

        #endregion Outros Métodos

        #region Métodos da Interface IDivergenciaAlocacao

        public void AtualizarListaDivergenciasAlocacao()
        {
            this.DtgDivergenciaAlocacao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void InformarSucessoOperacao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.SucessoOperacao").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion

        #endregion

        #region [ABA 4] Divergencia Central Depositária

        #region IDivergenciaCentralDepositaria Members

        public void AtualizarListaDivergenciasCentralDepositaria()
        {
            grdDivergenciaCentralDepositaria.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public bool ConfirmarReenvioTodasMensagens()
        {
            SinacorMessageBoxResult resultMensagem;
            resultMensagem = SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Alocacao.Message.ConfirmarReenvioTodas"), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);
            if (resultMensagem == SinacorMessageBoxResult.Yes){return true;}else{return false;}
        }

        public void InformarSucessoExecucaoConciliacao()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.ConciliacaoExecutadaSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarSucessoReenvioMensagens()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.ProcessoReenvioConcluido").ToString(), SinacorMessageBoxImage.Information);
        }

        public void SelecionarDataPregaoDivergenciaCentralDepositaria(Sinacor.UI.Bovespa.Alocacao.Model.InformacoesMovimento model)
        {
            cmbDataMovimento.SelectedValue = model.DataMovimento;
        }

        public void InformarPesquisaSemResultado()
        {
            this.ShowError("Bovespa.Alocacao.Message.PesquisaSemRetorno");
            this.AtualizarListaDivergenciasCentralDepositaria();
        }

        /// <summary>
        /// Exibe mensagem informando ao usuário que existem mensagens que não serão enviadas.
        /// </summary>
        public void InformarMensagemNaoEnviada()
        {
            SinacorMessageBox.Show(TryFindResource("Bovespa.Alocacao.Message.RegistrosNaoEnviados").ToString(), SinacorMessageBoxImage.Exclamation);
        }

        #endregion

        #region Event Handler
        //Divergencia Central Depositária
        private void btnPesquisar_Click(object sender, RoutedEventArgs e)
        {
            base.ShowUserWaitingProcess();
            ClearServiceErrors();
            //BotaoDesabilitar();

            if (optNaturezaOperacaoCompraVenda.IsChecked == true)
            {
                PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.NaturezaOperacao = Model.Enum.NaturezaOperacao.CompraVenda;
            }
            else if (optNaturezaOperacaoCompra.IsChecked == true)
            {
                PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
            }
            else if (optNaturezaOperacaoVenda.IsChecked == true)
            {
                PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
            }

            if (PesquisarCodigoClienteTxt.Text != "")
            {
                int retorno;

                if (int.TryParse(PesquisarCodigoClienteTxt.Text, out retorno))
                {
                    PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.CodigoCliente = retorno;
                    PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.ApelidoCliente = null;
                }
                else
                {
                    PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.ApelidoCliente = PesquisarCodigoClienteTxt.Text;
                    PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.CodigoCliente = null;
                }                
            }
            else
            {
                PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.ApelidoCliente = null;
                PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.CodigoCliente = null;
            }

            PresenterDivergenciaCentralDepositaria.ConsultarDivergenciasCentralDepositaria();
            base.HideUserWaitingProcess();
        }

        private void btnNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            ClearServiceErrors();
            PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria = new Sinacor.UI.Bovespa.Alocacao.Model.Parameter.FiltroDivergenciaCentralDepositaria();
            cmbDataMovimento.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            cmbDataMovimento.SelectedIndex = 0;
            PesquisarAtivoTxt.UpdateTarget(SinacorTextBox.TextProperty);
            MercadoCombobox.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            MercadoCombobox.SelectedIndex = 0;
            PesquisarCodigoClienteTxt.UpdateTarget(SinacorTextBox.TextProperty);
            NNegocioTxt.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            this.optNaturezaOperacaoCompraVenda.IsChecked = true;
            this.PresenterDivergenciaCentralDepositaria.ListaDivergenciasCentralDepositaria = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.DivergenciaCentralDepositaria>();
            AtualizarListaDivergenciasCentralDepositaria();
            BotaoHabilitar();
        }

        private void PesquisarAtivoButton_Click(object sender, RoutedEventArgs e)
        {
            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo();
            modelTitulo.Codigo = PesquisarAtivoTxt.Text;
            modelTitulo.Mercado = null;
            modelTitulo.DataPregao = ((Model.Calendario)cmbDataMovimento.SelectedItem).DataPregao;
            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Alocacao.Label.MonitorAlocacao");
            pesquisaTitulo.ShowDialog();


            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this.PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.Ativo = pesquisaTitulo.TituloEscolhido.Codigo;
                PesquisarAtivoTxt.UpdateTarget(SinacorTextBox.TextProperty);
            }

            PesquisarAtivoTxt.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void PesquisarClienteButton_Click(object sender, RoutedEventArgs e)
        {
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente() { Apelido = PesquisarCodigoClienteTxt.Text };

            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CasamentoManual, filtroPesq);

            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Alocacao.Label.MonitorAlocacao");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                this.PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.CodigoCliente = pesquisaClientes.PesquisaClienteModel.Codigo;
                this.PresenterDivergenciaCentralDepositaria.FiltroDivergenciaCentralDepositaria.ApelidoCliente = pesquisaClientes.PesquisaClienteModel.Apelido;
                PesquisarCodigoClienteTxt.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void BotaoDesabilitar()
        {
            cmbDataMovimento.IsEnabled = false;
            PesquisarAtivoTxt.IsEnabled = false;
            PesquisarAtivoButton.IsEnabled = false;
            MercadoCombobox.IsEnabled = false;
            PesquisarCodigoClienteTxt.IsEnabled = false;
            PesquisarClienteButton.IsEnabled = false;
            NNegocioTxt.IsEnabled = false;
            optNaturezaOperacaoCompraVenda.IsEnabled = false;
            optNaturezaOperacaoCompra.IsEnabled = false;
            optNaturezaOperacaoVenda.IsEnabled = false;
            //btnPesquisar.IsEnabled = false;
        }
        private void BotaoHabilitar()
        {
            cmbDataMovimento.IsEnabled = true;
            PesquisarAtivoTxt.IsEnabled = true;
            PesquisarAtivoButton.IsEnabled = true;
            MercadoCombobox.IsEnabled = true;
            PesquisarCodigoClienteTxt.IsEnabled = true;
            PesquisarClienteButton.IsEnabled = true;
            NNegocioTxt.IsEnabled = true;
            optNaturezaOperacaoCompraVenda.IsEnabled = true;
            optNaturezaOperacaoCompra.IsEnabled = true;
            optNaturezaOperacaoVenda.IsEnabled = true;
            //btnPesquisar.IsEnabled = true;
        }

        private void menuContextualDivergenciaCentralDepositaria_Loaded(object sender, RoutedEventArgs e)
        {
            if (PresenterDivergenciaCentralDepositaria.ListaDivergenciasCentralDepositaria != null)
            {                
                var lista = from l in PresenterDivergenciaCentralDepositaria.ListaDivergenciasCentralDepositaria
                            where l.IndicadorCiencia == true
                            select l;
                SinacorContextMenuItem menuItem;
                menuItem = (SinacorContextMenuItem)ControlHelper.FindChild((DependencyObject)e.OriginalSource, "menuReenviarSelecionadas");
                menuItem.IsEnabled = grdDivergenciaCentralDepositaria.SelectedItems != null && grdDivergenciaCentralDepositaria.SelectedItems.Count > 0;
                menuItem = (SinacorContextMenuItem)ControlHelper.FindChild((DependencyObject)e.OriginalSource, "menuReenviarTodas");
                menuItem.IsEnabled = PresenterDivergenciaCentralDepositaria.ListaDivergenciasCentralDepositaria.Count > 0;
                menuItem = (SinacorContextMenuItem)ControlHelper.FindChild((DependencyObject)e.OriginalSource, "menuConciliarPregao");
                menuItem.IsEnabled = grdDivergenciaCentralDepositaria.SelectedValue != null;
            }
        }

        private void menuConciliarPregao_Click(object sender, RoutedEventArgs e)
        {
            PresenterDivergenciaCentralDepositaria.ExecutarConciliacaoCentralDepositaria();
        }

        private void menuReenviarSelecionadas_Click(object sender, RoutedEventArgs e)
        {
            if (grdDivergenciaCentralDepositaria.SelectedItems != null)
            {
                PresenterDivergenciaCentralDepositaria.ReenviarDivergenciasSelecionadas(new ModelCollection<Model.DivergenciaCentralDepositaria>(grdDivergenciaCentralDepositaria.SelectedItems));
            }
        }

        private void menuReenviarTodas_Click(object sender, RoutedEventArgs e)
        {
            PresenterDivergenciaCentralDepositaria.ReenviarTodasDivergencias();
        }

        private void CentralDepositariaTabItem_GotFocus(object sender, RoutedEventArgs e)
        {
            if (RotularExpPesquisa)
            {
                expPesquisa.Header = string.Format(this.TryFindResource("Bovespa.Alocacao.Label.UltimaSolicitacaoCBLC").ToString(),
                                                  this.PresenterDivergenciaCentralDepositaria.InformacoesMovimento.DataMovimento.Date.ToShortDateString(),
                                                  this.PresenterDivergenciaCentralDepositaria.InformacoesMovimento.DataMovimento.ToShortTimeString());
                RotularExpPesquisa = false;
            }
        }

        #endregion

        private void cmbDataMovimento_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void grdDivergenciaCentralDepositaria_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                Model.DivergenciaCentralDepositaria currentModel = new Sinacor.UI.Bovespa.Alocacao.Model.DivergenciaCentralDepositaria();
                currentModel = (Model.DivergenciaCentralDepositaria)e.ItemInfo.Item;

                if (e.OriginalSource is BaseRow)
                {
                    if (currentModel.Origem == Model.Enum.OrigemMensagem.Sinacor)
                    {
                        if (currentModel.CodigoUsuario == null)
                        {
                            e.Style = BaseRow.GridRowBusiness06;
                        }
                        else
                        {
                            e.Style = BaseRow.GridRowBusiness06;
                        }
                    }
                    else
                    {
                        e.Style = BaseRow.GridRowBusiness02;
                    }
                }
                else if (e.OriginalSource is BaseCell)
                {
                    if (currentModel.Origem == Model.Enum.OrigemMensagem.Sinacor)
                    {
                        if (currentModel.CodigoUsuario == null)
                        {
                            ((BaseCell)e.OriginalSource).IsEnabled = true;
                        }
                    }
                }
            }
        }
        #endregion                   
    }
}
